/*
 * Copyright:  2018 smarabbit studio.
 *
 *  Licensed under the Confluent Community License; you may not use this file
 *  except in compliance with the License.  You may obtain a copy of the License at
 *
 *  http://www.confluent.io/confluent-community-license
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 *  WARRANTIES OF ANY KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations under the License.
 *
 *  @作   者： 黄开晖 (117227773@qq.com)
 *  @日   期:  2021年5月23日
 */
package com.massyframework.beanskin.service;

import java.util.List;

import com.massyframework.beanskin.util.version.Version;

/**
 * 服务引用
 * 
 * <p>
 * 管理注册服务时的服务属性，用于查找过滤定位特定的服务。
 * @author huangkh
 *
 */
public interface ServiceReference<S> {

	/**
     * 注册服务模块的组编号
     */
    static final String MODULE_GROUPID           = "module.groupId";
    
    /**
     * 注册服务模块的编号
     */
    static final String MODULE_MODULEID          = "module.moduleId";
        
    /**
     * 注册服务模块的版本
     */
    static final String MODULE_VERSION           = "module.version";
    
    /**
     * 注册服务模块的标识符(字符串)
     */
    static final String MODULE_IDENTIFIER        = "module.identifier";

    /**
     * 服务说明
     */
    static final String SERVICE_DESCRIPTION      = "service.description";

    /**
     * 服务编号，由系统自动生成
     */
    static final String SERVICE_ID               = "service.id";

    /**
     * 用于区分多个同类型服务的名称
     */
    static final String SERVICE_NAME             = "service.name";

    /**
     * 服务注册的类型
     */
    static final String EXPORT_TYPES             = "service.types";

    /**
     * 服务排名,其值为int。<br>
     * 默认该值为0
     */
    static final String SERVICE_RANKING          = "service.ranking";

    /**
     * 服务排名，最大值
     */
    static final String SERVICE_RANKING_MAXVALUE = "2147483647";

    /**
     * 服务版本
     */
    static final String SERVICE_VERSION          = "service.version";

    /**
     * 是否为ServiceFactory
     */
    static final String SERVICE_ISFACTORY        = "service.isFactory";
    
    /**
     * 允许访问本服务的模块组编号
     */
    static final String ALLOW_ACCESS_GROUPID     = "allow.access.groupId";
    
    /**
     * 允许访问服务的模块组编号
     * @return {@link String[]}
     */
    default String[] getAllowAccessGroupId() {
    	return this.getProperty(ALLOW_ACCESS_GROUPID, String[].class);
    }

    /**
     * 模块组编号
     * @return {@link String}
     */
    default String getGroupId(){
        return this.getProperty(MODULE_GROUPID, String.class);
    }
    
    /**
     * 模块编号
     * @return {@link String}
     */
    default String getModuleId() {
    	return this.getProperty(MODULE_MODULEID, String.class);
    }
    
    /**
     * 模块版本
     * @return {@link Version}
     */
    default Version getModuleVersion() {
    	return this.getProperty(MODULE_VERSION, Version.class);
    }
    
    /**
     * 模块标识符
     * @return {@link String}
     */
    default String getModuleIdentifier() {
    	return this.getProperty(MODULE_IDENTIFIER, String.class);
    }

    /**
     * 按<code>name</code>获取属性
     * @param name {@link String}, 属性名
     * @return {@link Object}, 属性值，属性不存在返回null.
     */
    Object getProperty(String name);

    /**
     * 按<code>name</code>获取属性，并按指定的类型返回
     * @param name {@link String}, 属性名
     * @param propType {@link Class}, 返回类型
     * @param <P>
     * @return {@link P}, 属性值，属性不存在返回null.
     */
    default <P> P getProperty(String name, Class<P> propType){
        Object result = this.getProperty(name);
        return result == null ? null : propType.cast(result);
    }

    /**
     * 获取所有属性名
     * @return {@link List}, 属性名列表
     */
    List<String> getPropertyNames();

    /**
     * 服务说明
     * @return {@link String}, 未设置返回null.
     */
    default String getServiceDescription(){
        return this.getProperty(SERVICE_DESCRIPTION, String.class);
    }

    /**
     * 服务编号, 由系统自动生成
     * @return {@link long}
     */
    default long getServiceId(){
        Long result = this.getProperty(SERVICE_ID, Long.class);
        return result.longValue();
    }

    /**
     * 服务名称
     * @return {@link String}, 未设置返回null.
     */
    default String getServiceName() {
        return this.getProperty(SERVICE_NAME, String.class);
    }

    /**
     * 服务排名
     * @return {@link int}
     */
    default int getServiceRanking(){
        Integer result = this.getProperty(SERVICE_RANKING, Integer.class);
        return result == null ? 0 : result.intValue();
    }

    /**
     * 输出的服务类型，数组
     * @return {@link Class}数组。
     */
    default Class<?>[] getExportTypes(){
        return this.getProperty(EXPORT_TYPES, Class[].class);
    }

    /**
     * 服务版本
     * @return {@link String},可能返回null.
     */
    default Version getServiceVersion(){
    	Version result = this.getProperty(SERVICE_VERSION, Version.class);
       return result == null ? Version.emptyVersion : result;
    }

    /**
     * 是否为ServiceFactory实例
     * @return {@link boolean}, 返回{@code true}表示当前注册对象为ServiceFactory实例，否则返回{@code false}
     */
    default boolean isFactory() {
        Boolean result =  this.getProperty(SERVICE_ISFACTORY, Boolean.class);
        return result == null ? false : result.booleanValue();
    }
}
